/*-------------------------------------------------------------------------
 *
 * pg_depend.h
 *	  "依赖" 系统目录 (pg_depend) 的定义
 *
 * pg_depend 没有预加载内容，因此没有 pg_depend.dat
 * 文件；系统定义对象的依赖关系在 initdb 期间动态加载。
 * 大多数内置对象的内容都是固定的，因此不需要在 
 * pg_depend 中显式条目。
 *
 * 注：我们并不在 pg_depend 中表示所有可能的依赖对；
 * 例如，表示从属性到其关系的显式依赖关系并没有多大意义。
 * 通常，我们仅在关系是条件性而非必需的情况下
 * 产生依赖（例如，并非所有触发器都依赖于约束，但所有
 * 属性都依赖于关系）或当依赖关系不方便从其他目录的内容中找到时。
 *
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/catalog/pg_depend.h
 *
 * NOTES
 *	  Catalog.pm 模块读取此文件并推导模式
 *	  信息。
 *
 *-------------------------------------------------------------------------
 */
#ifndef PG_DEPEND_H
#define PG_DEPEND_H

#include "catalog/genbki.h"
#include "catalog/pg_depend_d.h"

/* ----------------
 *		pg_depend 定义。 cpp 将其转化为
 *		typedef struct FormData_pg_depend
 * ----------------
 */
CATALOG(pg_depend,2608,DependRelationId)
{
	/*
	 * 被依赖（引用）对象的标识。
	 */
	Oid			classid BKI_LOOKUP(pg_class);	/* 包含对象的表的 OID */
	Oid			objid;			/* 对象本身的 OID */
	int32		objsubid;		/* 列号，或 0 如果未使用 */

	/*
	 * 独立（被引用）对象的标识。
	 */
	Oid			refclassid BKI_LOOKUP(pg_class);	/* 包含对象的表的 OID */
	Oid			refobjid;		/* 对象本身的 OID */
	int32		refobjsubid;	/* 列号，或 0 如果未使用 */

	/*
	 * 关系的精确语义由 deptype 字段指定。
	 * 参见 catalog/dependency.h 中的 DependencyType。
	 */
	char		deptype;		/* 参见 dependency.h 中的代码 */
} FormData_pg_depend;

/* ----------------
 *		Form_pg_depend 对应指向具有 pg_depend 关系格式的行的指针。
 * ----------------
 */
typedef FormData_pg_depend *Form_pg_depend;

DECLARE_INDEX(pg_depend_depender_index, 2673, DependDependerIndexId, on pg_depend using btree(classid oid_ops, objid oid_ops, objsubid int4_ops));
DECLARE_INDEX(pg_depend_reference_index, 2674, DependReferenceIndexId, on pg_depend using btree(refclassid oid_ops, refobjid oid_ops, refobjsubid int4_ops));

#endif							/* PG_DEPEND_H */
